﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using DevExpress.XtraEditors;
using DevExpress.XtraBars.Ribbon;
using System.Collections;
using System.Windows.Forms;
using System.IO;

namespace MainUI
{
    public class MRUArrayList : ArrayList
    {
        public static string MRUFileName = "RibbonMRUFiles.ini";
        public static string MRUFolderName = "RibbonMRUFolders.ini";

        Control container;
        int maxRecentFiles = 9;
        Image imgChecked, imgUncheked, glyph;
        public event EventHandler LabelClicked;
        bool indexedList;
        bool showDescription;
        public MRUArrayList(Control cont, Image iChecked, Image iUnchecked, Image glyph, bool indexedList, bool showDescription)
            : this(cont, iChecked, iUnchecked, glyph)
        {
            this.indexedList = indexedList;
            this.showDescription = showDescription;
        }
        public MRUArrayList(Control cont, Image iChecked, Image iUnchecked, Image glyph)
            : this(cont, iChecked, iUnchecked)
        {
            this.glyph = glyph;
        }
        public MRUArrayList(Control cont, Image iChecked, Image iUnchecked)
            : base()
        {
            this.indexedList = true;
            this.imgChecked = iChecked;
            this.imgUncheked = iUnchecked;
            this.container = cont;
        }
        int GetLastAppMenuFileLabelIndex()
        {
            for (int i = container.Controls.Count - 1; i >= 0; i--)
            {
                if (container.Controls[i] is AppMenuFileLabel)
                    return i + 1;
            }
            return 0;
        }
        public void InsertElement(object value)
        {
            string[] names = value.ToString().Split(',');
            string name = names[0];
            bool checkedLabel = false;
            if (names.Length > 1) checkedLabel = names[1].ToLower().Equals("true");
            foreach (Control c in container.Controls)
            {
                AppMenuFileLabel ml = c as AppMenuFileLabel;
                if (ml == null)
                    continue;
                if (ml.Tag.Equals(name))
                {
                    checkedLabel = ml.Checked;
                    base.Remove(name);
                    ml.LabelClick -= new EventHandler(OnLabelClick);
                    ml.Dispose();
                    break;
                }
            }
            bool access = true;
            if (base.Count >= maxRecentFiles)
                access = RemoveLastElement();
            if (access)
            {
                if (!base.Contains(name))
                    base.Insert(0, name);
                AppMenuFileLabel ml = new AppMenuFileLabel();
                int index = GetLastAppMenuFileLabelIndex();
                container.Controls.Add(ml);
                container.Controls.SetChildIndex(ml, index);
                ml.Tag = name;
                if (showDescription)
                {
                    ml.Text = GetFileName(name);
                    ml.Description = name;
                    ml.ImageToolTip = "Ghim thư mục";
                    ml.SelectedImageToolTip = "Bỏ ghim thư mục";
                }
                else
                {
                    ml.Text = GetFileName(name);
                    ml.ImageToolTip = "Ghim tệp tin";
                    ml.SelectedImageToolTip = "Bỏ ghim tệp tin";
                }
                ml.Glyph = glyph;
                ml.Checked = checkedLabel;
                ml.AutoHeight = true;
                ml.Dock = DockStyle.Top;
                ml.Image = imgUncheked;                
                ml.SelectedImage = imgChecked;
                ml.LabelClick += new EventHandler(OnLabelClick);
                if (indexedList)
                    SetElementsRange();
            }
        }
        void OnLabelClick(object sender, EventArgs e)
        {
            if (LabelClicked != null)
                LabelClicked(((AppMenuFileLabel)sender).Tag.ToString(), e);
        }
        public bool RemoveLastElement()
        {
            for (int i = 0; i < container.Controls.Count; i++)
            {
                AppMenuFileLabel ml = container.Controls[i] as AppMenuFileLabel;
                if (ml != null && !ml.Checked)
                {
                    base.Remove(ml.Tag);
                    ml.LabelClick -= new EventHandler(OnLabelClick);
                    ml.Dispose();
                    return true;
                }
            }
            return false;
        }
        string GetFileName(object obj)
        {
            if (obj.ToString() == "" || obj == null) return null;
            FileInfo fi = new FileInfo(obj.ToString());
            return fi.Name;
        }
        void SetElementsRange()
        {
            int i = 0;
            foreach (Control c in container.Controls)
            {
                AppMenuFileLabel ml = c as AppMenuFileLabel;
                if (ml == null)
                    continue;
                ml.Caption = string.Format("&{0}", container.Controls.Count - i);
                i++;
            }
        }
        public bool GetLabelChecked(string name)
        {
            foreach (Control c in container.Controls)
            {
                AppMenuFileLabel ml = c as AppMenuFileLabel;
                if (ml == null)
                    continue;
                if (ml.Tag.Equals(name)) return ml.Checked;
            }
            return false;
        }
        public void Init(string fileName, string defaultItem)
        {
            if (!System.IO.File.Exists(fileName))
            {
                InsertElement(defaultItem);
                return;
            }
            System.IO.StreamReader sr = System.IO.File.OpenText(fileName);
            container.SuspendLayout();
            List<string> list = new List<string>();
            for (string s = sr.ReadLine(); s != null; s = sr.ReadLine())
            {
                if (list.Contains(s)) continue;
                list.Add(s);
            }
            for (int i = list.Count - 1; i >= 0; i--)
            {
                InsertElement(list[i]);
            }
            sr.Close();
            container.ResumeLayout();
        }
    }
}
